package com.party.pay;

/**
 * @author: zhaoyongke
 * @create: 2025-09-01 15:30
 * @description: PayNotifyController
 */
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RestController
public class PayNotifyController {


    private static String mchKey = "fPqfOo0sVJ31uvWZPH3iRvnNIkJDeW0bajMWaU7lJPvXNlA2RgI4E3TA68qstVd1YXeMYqH8zTra460UItPDcVZ8Kk6iPR1AgvpBQCSqIOa9rCsGeQ1vHi35jWXRPeTe";



    /**
     * 支付结果通知接口（支付网关回调此接口）
     * 注意：接口地址必须与统一下单时传入的 notifyUrl 一致
     */
    @PostMapping("/api/pay/notify") // 示例路径，需与 notifyUrl 匹配
    public void handlePayNotify(
            @RequestBody PayNotifyRequest notifyRequest,
            HttpServletResponse response) throws IOException {

        // 步骤1：打印日志（方便排查问题）
        System.out.println("收到支付通知：" + JSON.toJSONString(notifyRequest));

        // 步骤2：验证签名（防止参数被篡改）
        boolean signValid = XunaySignUtil.verifyNotifySign(notifyRequest, mchKey);
        if (!signValid) {
            System.out.println("签名验证失败：" + notifyRequest.getSign());
            response.getWriter().write("fail"); // 返回非success，支付网关会重试
            return;
        }

        // 步骤3：验证订单状态（只处理支付成功的通知）
        if (notifyRequest.getState() != 2) {
            System.out.println("订单未支付成功，状态：" + notifyRequest.getState());
            response.getWriter().write("success"); // 非成功状态也返回success，避免重复通知
            return;
        }

        // 步骤4：处理业务逻辑（核心）
        try {
            // 4.1 验证订单存在性（通过商户订单号 mchOrderNo 查订单）
            String mchOrderNo = notifyRequest.getMchOrderNo();
//            Order order = orderService.getByMchOrderNo(mchOrderNo);
//            if (order == null) {
//                throw new RuntimeException("订单不存在：" + mchOrderNo);
//            }
//
//            // 4.2 验证金额一致性（防止金额被篡改）
//            if (order.getAmount() != notifyRequest.getAmount()) {
//                throw new RuntimeException("金额不一致，订单金额：" + order.getAmount()
//                        + "，通知金额：" + notifyRequest.getAmount());
//            }
//
//            // 4.3 验证订单状态（避免重复处理）
//            if (order.getStatus() == 2) { // 假设2代表已支付
//                System.out.println("订单已处理，无需重复操作：" + mchOrderNo);
//                response.getWriter().write("success");
//                return;
//            }
//
//            // 4.4 更新订单状态（标记为支付成功）
//            orderService.updateOrderPaySuccess(
//                    mchOrderNo,
//                    notifyRequest.getPayOrderId(), // 支付网关订单号
//                    notifyRequest.getChannelOrderNo(), // 渠道订单号（如微信订单号）
//                    notifyRequest.getSuccessTime() // 支付成功时间
//            );

            // 4.5 触发后续业务（如：记录支付日志、通知仓库发货、积分发放等）
            // orderService.triggerAfterPaySuccess(order);

        } catch (Exception e) {
            // 业务处理失败，记录错误日志，返回fail让支付网关重试
            System.err.println("通知处理失败：" + e.getMessage());
            response.getWriter().write("fail");
            return;
        }

        // 步骤5：返回成功响应（必须是纯小写的"success"，无空格/换行）
        response.getWriter().write("success");
    }
}
